/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.ufrn.engcomp.pds.helloopc.modelo.negocio.servico;

import br.ufrn.engcomp.pds.helloopc.modelo.dominio.IEntidade;
import br.ufrn.engcomp.pds.helloopc.modelo.persistencia.FactoryDAO;
import br.ufrn.engcomp.pds.helloopc.modelo.persistencia.IDAO;
import br.ufrn.engcomp.pds.helloopc.modelo.persistencia.PersistenciaException;
import java.lang.reflect.ParameterizedType;
import java.util.List;

/**
 *
 * @author ufrn
 */
public class AbstractServico<T extends IEntidade> implements IServico<T> {

    protected IDAO dao;

    public AbstractServico() /*throws NegocioException*/ {
        Class<T> classe = getClasseGenerica();

        try {
            dao = FactoryDAO.getInstance().createDAO(classe.getSimpleName());
        } catch(PersistenciaException pex) {
            //throw new NegocioException("Erro na criação do serviço de " + classe.getName() + ".", pex);
        }
    }

    @Override
    public void inserir(T entidade) {
        dao.inserir(entidade);
    }

    @Override
    public void inserir(List<T> entidades) {
        dao.inserir((List<IEntidade>)entidades);
    }

    @Override
    public void atualizar(T entidade) {
        dao.atualizar(entidade);
    }

    @Override
    public void atualizar(List<T> entidades) {
        dao.atualizar((List<IEntidade>)entidades);
    }

    @Override
    public void remover(T entidade) {
        dao.remover(entidade);
    }

    @Override
    public void remover(List<T> entidades) {
        dao.remover((List<IEntidade>)entidades);
    }

    @Override
    public void refresh(T entidade) {
        dao.refresh(entidade);
    }

    @Override
    public void refresh(List<T> entidades) {
        dao.refresh((List<IEntidade>)entidades);
    }

    @Override
    public T buscarPorID(Object id) {
        return (T)dao.buscarPorID(getClasseGenerica(), id);
    }

    @Override
    public List<T> buscarTodos() {
        return (List<T>)dao.buscarTodos(getClasseGenerica());
    }

    @Override
    public void beginTransaction() {
        dao.beginTransaction();
    }

    @Override
    public void commitTransaction() {
        dao.commitTransaction();
    }

    @Override
    public void rollbackTransaction() {
        dao.rollbackTransaction();
    }

    private Class<T> getClasseGenerica() {
        return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

}
